package org.jeecg.config;

import org.apache.commons.lang.ArrayUtils;
import org.jeecg.common.annotation.Interceptor;
import org.jeecg.common.util.SpringContextUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.*;

/**
 * Spring Boot 2.0 解决跨域问题
 *
 * @Author qinfeng
 *
 */
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {

    @Value("${jeecg.path.upload}")
    private String upLoadPath;
    @Value("${jeecg.path.webapp}")
    private String webAppPath;
    @Value("${spring.resource.static-locations}")
    private String staticLocations;

    /**
     * 静态资源的配置 - 使得可以从磁盘中读取 Html、图片、视频、音频等
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**")
                .addResourceLocations("file:" + upLoadPath + "//", "file:" + webAppPath + "//")
                .addResourceLocations(staticLocations.split(","));
    }
    /**
     * 新增Interceptor拦截器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        ApplicationContext context = SpringContextUtils.getApplicationContext();
        String[] beanNames = context.getBeanNamesForAnnotation(Interceptor.class);
        for (String beanName : beanNames) {
            Object bean = context.getBean(beanName);
            if (bean instanceof HandlerInterceptor) {
                Interceptor interceptor = bean.getClass().getAnnotation(Interceptor.class);
                String[] addPath = interceptor.addPath();
                String[] excludePath = interceptor.excludePath();
                InterceptorRegistration registration = registry.addInterceptor((HandlerInterceptor)bean);
                if (ArrayUtils.isNotEmpty(addPath)) {
                    registration.addPathPatterns(addPath);
                }
                if (ArrayUtils.isNotEmpty(excludePath)) {
                    registration.excludePathPatterns(excludePath);
                }
            }
        }
    }
    /**
     * 方案一： 默认访问根路径跳转 doc.html页面 （swagger文档页面）
     * 方案二： 访问根路径改成跳转 index.html页面 （简化部署方案： 可以把前端打包直接放到项目的 webapp，上面的配置）
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("doc.html");
    }

    @Bean
    @Conditional(CorsFilterCondition.class)
    public CorsFilter corsFilter() {
        final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
        final CorsConfiguration corsConfiguration = new CorsConfiguration();
        //是否允许请求带有验证信息
        corsConfiguration.setAllowCredentials(true);
        // 允许访问的客户端域名
        corsConfiguration.addAllowedOrigin("*");
        // 允许服务端访问的客户端请求头
        corsConfiguration.addAllowedHeader("*");
        // 允许访问的方法名,GET POST等
        corsConfiguration.addAllowedMethod("*");
        urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
        return new CorsFilter(urlBasedCorsConfigurationSource);
    }

}
